/*!
 * \file WTSStruct.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief WonderTrader基础数据结构定义文件
 * 
 * \details 本文件定义了WonderTrader框架中的核心数据结构：
 *          - K线数据结构：WTSBarStruct（新版本）和WTSBarStructOld（旧版本）
 *          - 行情数据结构：WTSTickStruct（新版本）和WTSTickStructOld（旧版本）
 *          - 委托队列结构：WTSOrdQueStruct，用于记录委托队列详情
 *          - 委托明细结构：WTSOrdDtlStruct，用于记录逐笔委托信息
 *          - 成交明细结构：WTSTransStruct，用于记录逐笔成交信息
 *          
 *          新版本结构体采用8字节对齐方式，提高了数据处理效率和兼容性。
 *          旧版本结构体保留用于数据兼容和转换，支持从旧格式到新格式的无缝升级。
 */
#pragma once
#include <memory>
#include <stdint.h>
#include <string.h>
#include "WTSTypes.h"

#ifdef _MSC_VER
#pragma warning(disable:4200)
#endif

NS_WTP_BEGIN

#pragma pack(push, 1)

/*!
 * \brief 旧版K线数据结构体（1字节对齐）
 * 
 * \details 保留的旧版K线数据结构，采用1字节对齐方式，主要用于：
 *          - 历史数据兼容性支持
 *          - 数据格式转换
 *          - 向后兼容处理
 *          
 *          包含基本的OHLC数据、成交量、持仓量等核心K线信息。
 * 
 * \note 新项目建议使用WTSBarStruct结构体
 */
struct WTSBarStructOld
{
public:
	/*!
	 * \brief 构造函数，初始化所有成员为0
	 */
	WTSBarStructOld()
	{
		memset(this, 0, sizeof(WTSBarStructOld));
	}

	uint32_t	date;		//交易日期，格式如20140327
	uint32_t	time;		//时间戳，分钟级别或秒级别
	double		open;		//开盘价
	double		high;		//最高价
	double		low;		//最低价
	double		close;		//收盘价
	double		settle;		//结算价
	double		money;		//成交金额

	uint32_t	vol;		//成交量
	uint32_t	hold;		//持仓量
	int32_t		add;		//增仓量
};

/*!
 * \brief 旧版行情数据结构体（1字节对齐）
 * 
 * \details 保留的旧版tick行情数据结构，包含：
 *          - 基础价格信息：最新价、开高低收等
 *          - 成交统计信息：成交量、成交额、持仓量等
 *          - 委托队列信息：十档买卖盘委托价格和数量
 *          - 时间戳信息：交易日期、行情时间等
 *          
 *          主要用于历史数据兼容和数据格式转换。
 * 
 * \note 新项目建议使用WTSTickStruct结构体
 */
struct WTSTickStructOld
{
	char		exchg[10];					//交易所代码
	char		code[MAX_INSTRUMENT_LENGTH];	//合约代码

	double		price;				//最新价
	double		open;				//开盘价
	double		high;				//最高价
	double		low;				//最低价
	double		settle_price;		//结算价

	double		upper_limit;		//涨停价
	double		lower_limit;		//跌停价

	uint32_t	total_volume;		//总成交量
	uint32_t	volume;				//成交量
	double		total_turnover;		//总成交额
	double		turn_over;			//成交额
	uint32_t	open_interest;		//持仓量
	int32_t		diff_interest;		//增仓量

	uint32_t	trading_date;		//交易日期，格式如20140327
	uint32_t	action_date;		//自然日期，格式如20140327
	uint32_t	action_time;		//行情时间，精确到毫秒，格式如105932000

	double		pre_close;			//昨收价
	double		pre_settle;			//昨结算价
	int32_t		pre_interest;		//昨日持仓量

	double		bid_prices[10];		//买方委托价格（十档）
	double		ask_prices[10];		//卖方委托价格（十档）
	uint32_t	bid_qty[10];		//买方委托量（十档）
	uint32_t	ask_qty[10];		//卖方委托量（十档）
	
	/*!
	 * \brief 构造函数，初始化所有成员为0
	 */
	WTSTickStructOld()
	{
		memset(this, 0, sizeof(WTSTickStructOld));
	}
};

#pragma pack(pop)


//By Wesley @ 2021.12.31
//新的结构体，全部改成8字节对齐的方式
#pragma pack(push, 8)

/*!
 * \brief 新版K线数据结构体（8字节对齐）
 * 
 * \details 优化后的K线数据结构，采用8字节对齐方式，具有以下特点：
 *          - 更好的内存对齐和访问性能
 *          - 支持更高精度的数值类型（double替代uint32_t）
 *          - 64位时间戳支持，可精确到毫秒级别
 *          - 向前兼容，支持从旧结构体转换
 *          
 *          包含完整的OHLC数据、成交统计、持仓信息等。
 * 
 * \author Wesley
 * \date 2021.12.31
 */
struct WTSBarStruct
{
public:
	/*!
	 * \brief 构造函数，初始化所有成员为0
	 */
	WTSBarStruct()
	{
		memset(this, 0, sizeof(WTSBarStruct));
	}

	uint32_t	date;		//交易日期，格式如20140327
	uint32_t	reserve_;	//占位符，用于8字节对齐
	uint64_t	time;		//时间戳，支持毫秒级精度
	double		open;		//开盘价
	double		high;		//最高价
	double		low;		//最低价
	double		close;		//收盘价
	double		settle;		//结算价
	double		money;		//成交金额

	double		vol;		//成交量（使用double提高精度）
	double		hold;		//持仓量（使用double提高精度）
	double		add;		//增仓量（使用double提高精度）

	/*!
	 * \brief 从旧版结构体转换赋值操作符
	 * 
	 * \param bar 旧版K线结构体引用
	 * \return 当前结构体引用
	 * 
	 * \details 提供从旧版WTSBarStructOld到新版WTSBarStruct的无缝转换，
	 *          确保历史数据能够正确迁移到新格式。
	 */
	WTSBarStruct& operator = (const WTSBarStructOld& bar)
	{
		date = bar.date;
		time = bar.time;

		open = bar.open;
		high = bar.high;
		low = bar.low;
		close = bar.close;
		settle = bar.settle;
		money = bar.money;

		vol = bar.vol;
		hold = bar.hold;
		add = bar.add;

		return *this;
	}
};

/*!
 * \brief 新版行情数据结构体（8字节对齐）
 * 
 * \details 优化后的tick行情数据结构，具有以下改进：
 *          - 8字节对齐提升访问性能
 *          - 统一使用double类型提高数值精度
 *          - 更大的交易所代码字段长度
 *          - 完整的十档买卖盘信息
 *          - 详细的成交和持仓统计
 *          
 *          适用于高频交易、实时行情处理等场景。
 * 
 * \author Wesley
 * \date 2021.12.31
 */
struct WTSTickStruct
{
	char		exchg[MAX_EXCHANGE_LENGTH];		//交易所代码
	char		code[MAX_INSTRUMENT_LENGTH];	//合约代码

	double		price;				//最新价
	double		open;				//开盘价
	double		high;				//最高价
	double		low;				//最低价
	double		settle_price;		//结算价

	double		upper_limit;		//涨停价
	double		lower_limit;		//跌停价

	double		total_volume;		//总成交量
	double		volume;				//当日成交量
	double		total_turnover;		//总成交额
	double		turn_over;			//当日成交额
	double		open_interest;		//持仓量
	double		diff_interest;		//增仓量

	uint32_t	trading_date;		//交易日期，格式如20140327
	uint32_t	action_date;		//自然日期，格式如20140327
	uint32_t	action_time;		//行情时间，精确到毫秒，格式如105932000
	uint32_t	reserve_;			//占位符，用于8字节对齐

	double		pre_close;			//昨收价
	double		pre_settle;			//昨结算价
	double		pre_interest;		//昨日持仓量

	double		bid_prices[10];		//买方委托价格（十档）
	double		ask_prices[10];		//卖方委托价格（十档）
	double		bid_qty[10];		//买方委托量（十档）
	double		ask_qty[10];		//卖方委托量（十档）
	
	/*!
	 * \brief 构造函数，初始化所有成员为0
	 */
	WTSTickStruct()
	{
		memset(this, 0, sizeof(WTSTickStruct));
	}

	/*!
	 * \brief 从旧版结构体转换赋值操作符
	 * 
	 * \param tick 旧版行情结构体引用
	 * \return 当前结构体引用
	 * 
	 * \details 提供从旧版WTSTickStructOld到新版WTSTickStruct的转换，
	 *          包括字符串字段的安全拷贝和数值类型的精度提升。
	 */
	WTSTickStruct& operator = (const WTSTickStructOld& tick)
	{
		strncpy(exchg, tick.exchg, MAX_EXCHANGE_LENGTH);
		strncpy(code, tick.code, MAX_INSTRUMENT_LENGTH);

		price = tick.price;
		open = tick.open;
		high = tick.high;
		low = tick.low;
		settle_price = tick.settle_price;

		upper_limit = tick.upper_limit;
		lower_limit = tick.lower_limit;

		total_volume = tick.total_volume;
		total_turnover = tick.total_turnover;
		open_interest = tick.open_interest;
		volume = tick.volume;
		turn_over = tick.turn_over;
		diff_interest = tick.diff_interest;

		trading_date = tick.trading_date;
		action_date = tick.action_date;
		action_time = tick.action_time;

		pre_close = tick.pre_close;
		pre_settle = tick.pre_settle;
		pre_interest = tick.pre_interest;

		memcpy(bid_prices, tick.bid_prices, sizeof(bid_prices));
		memcpy(ask_prices, tick.ask_prices, sizeof(ask_prices));
		
		//将uint32_t数组转换为double数组
		for (int i = 0; i < 10; i++)
		{
			bid_qty[i] = tick.bid_qty[i];
			ask_qty[i] = tick.ask_qty[i];
		}

		return *this;
	}
};

/*!
 * \brief 委托队列数据结构体
 * 
 * \details 记录某个价位上的委托队列详细信息，包含：
 *          - 基本合约信息：交易所代码、合约代码
 *          - 时间信息：交易日期、自然日期、行情时间
 *          - 委托信息：委托方向、委托价格、委托数量分布
 *          - 队列详情：最多50笔委托的具体数量信息
 *          
 *          主要用于高频交易中的深度分析和流动性评估。
 */
struct WTSOrdQueStruct
{
	char		exchg[MAX_EXCHANGE_LENGTH];		//交易所代码
	char		code[MAX_INSTRUMENT_LENGTH];	//合约代码

	uint32_t	trading_date;		//交易日期，格式如20140327
	uint32_t	action_date;		//自然日期，格式如20140327
	uint32_t	action_time;		//行情时间，精确到毫秒，格式如105932000
	WTSBSDirectType	side;		//委托方向（买/卖）

	double		price;			//委托价格
	uint32_t	order_items;	//委托笔数
	uint32_t	qsize;			//队列长度
	uint32_t	volumes[50];	//委托量明细（最多50笔）

	/*!
	 * \brief 构造函数，初始化所有成员为0
	 */
	WTSOrdQueStruct()
	{
		memset(this, 0, sizeof(WTSOrdQueStruct));
	}
};

/*!
 * \brief 委托明细数据结构体
 * 
 * \details 记录逐笔委托的详细信息，包含：
 *          - 基本合约信息：交易所代码、合约代码
 *          - 时间信息：交易日期、自然日期、行情时间
 *          - 委托详情：委托编号、价格、数量、方向、类型
 *          
 *          用于分析市场微观结构，跟踪大单委托，识别交易模式。
 */
struct WTSOrdDtlStruct
{
	char		exchg[MAX_EXCHANGE_LENGTH];		//交易所代码
	char		code[MAX_INSTRUMENT_LENGTH];	//合约代码

	uint32_t		trading_date;		//交易日期，格式如20140327
	uint32_t		action_date;		//自然日期，格式如20140327
	uint32_t		action_time;		//行情时间，精确到毫秒，格式如105932000

	uint64_t		index;			//委托编号（从1开始，递增1）
	double			price;			//委托价格
	uint64_t		volume;			//委托数量
	WTSBSDirectType		side;		//委托方向（买/卖）
	WTSOrdDetailType	otype;		//委托类型

	/*!
	 * \brief 构造函数，初始化所有成员为0
	 */
	WTSOrdDtlStruct()
	{
		memset(this, 0, sizeof(WTSOrdDtlStruct));
	}
};

/*!
 * \brief 成交明细数据结构体
 * 
 * \details 记录逐笔成交的详细信息，包含：
 *          - 基本合约信息：交易所代码、合约代码
 *          - 时间信息：交易日期、自然日期、行情时间
 *          - 成交详情：成交编号、价格、数量、方向、类型
 *          - 关联信息：买方委托序号、卖方委托序号
 *          
 *          用于分析成交分布，识别主动成交方向，计算市场冲击成本。
 */
struct WTSTransStruct
{
	char		exchg[MAX_EXCHANGE_LENGTH];		//交易所代码
	char		code[MAX_INSTRUMENT_LENGTH];	//合约代码

	uint32_t	trading_date;		//交易日期，格式如20140327
	uint32_t	action_date;		//自然日期，格式如20140327
	uint32_t	action_time;		//行情时间，精确到毫秒，格式如105932000
	uint32_t	index;			//成交编号（从1开始，递增1）

	WTSTransType	ttype;			//成交类型：如'C'表示普通成交
	WTSBSDirectType	side;			//买卖标志（主动成交方向）

	double			price;			//成交价格
	uint32_t		volume;			//成交数量
	int32_t			askorder;		//卖方委托序号
	int32_t			bidorder;		//买方委托序号

	/*!
	 * \brief 构造函数，初始化所有成员为0
	 */
	WTSTransStruct()
	{
		memset(this, 0, sizeof(WTSTransStruct));
	}
};

#pragma pack(pop)

NS_WTP_END
